package main

import (
	"fmt"
	"go.uber.org/atomic"
)

//type foo struct {
//	running int32
//}
//func (f *foo) start() {
//	if atomic.SwapInt32(&f.running, 1) == 1 {
//		// already running
//		return
//	}
//	// start the foo
//}
//func (f *foo) isRunning() bool {
//	return f.running == 1 // race!
//}
// 使用 go.uber.org/atomic
type foo2 struct {
	running atomic.Bool
}

func (f *foo2) start() {
	if f.running.Swap(true) {
		// already running
		return
	}
	// start the foo
}
func (f *foo2) isRunning() bool {
	return f.running.Load()
}

func main() {
	var f foo2
	f.start()
	fmt.Println("isRunning:", f.isRunning())
}
